package com.jacob.androidstudy.androidnote.userinterface;

import android.R.anim;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.MediaStore.Audio;
import android.widget.RemoteViews;
import android.widget.Toast;

/**
 * Notification
 * “用户提醒”主要分3种：
 * Toast - 用于来自后台的短消息。
 * StatusBarNotification - 用于持续显示后台的消息，并需要用户处理。
 * Dialog - 用于和Activity有关的提醒。
 * 
 * 
 * 
 * 
 *
 */
public class Notification用户提醒 extends Activity {
	
	/**
	 * Toast
	 * 是在窗口上面弹出的消息。Toast根据消息大小占用小块屏幕空间，当前的Activity仍保持可见活动的状态。
	 * Toast自动的淡入、淡出，不和用户进行互动。Toast可以被后台服务生成，所以程序不可见时也可以弹出。
	 * Toast适用于简短的文本消息（要很确定消息弹出时，用户正在看屏幕），比如“下载成功”。若是需要用户进行处理的提醒，应该考虑使用Dialog。
	 * 
	 */
	public void AboutToast() {
//		在屏幕上显示Toast，持续3秒。
		Toast.makeText(this, "下载成功", 3000);
	}
	
	
	/**
	 * StatusBarNotification
	 * “状态栏提醒”是系统状态栏上的图标（还可包含滚动文字），外带通知栏上的1个提醒，还可以附加上铃声、震动或硬件闪光灯等。
	 * 当用户点击了通知栏上的提醒，系统会发送一个Intent（通常是启动一个Activity）。
	 * “状态栏提醒”适用于后台程序有事件要通知用户。若当前程序有事件要通知用户，应该考虑使用Dialog。
	 * 
	 * 
	 * 
	 */
	public void AboutStatusBarNotification() {
//		创建StatusBarNotification
//		1 得到NotificationManager对象。此对象是Android系统服务，用来执行和管理所有的StatusBarNotification。
		NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
		
//		2 创建Notification对象。Android 3.0之后可以使用Notification.Builder来更加简单的创建Notification对象。
		Notification notification = new Notification(android.R.drawable.ic_notification_overlay, "滚动文字", System.currentTimeMillis());
		
//		设置Notification对象的Flag。
		notification.flags = Notification.FLAG_AUTO_CANCEL; //用户点击后，提醒自动cancelled。
		notification.flags = Notification.FLAG_NO_CLEAR; //提醒不能被通知栏上的“清除”按钮cancelled
		notification.flags = Notification.FLAG_ONGOING_EVENT; //提醒表示后台正在运行服务，例如“正在通话提醒”。
		
//		设置Notification对象的默认效果
		notification.defaults |= Notification.DEFAULT_ALL; //全部使用默认
		
//		设置Notification对象的铃声
		notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "1"); //设置媒体库中的铃声
		notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3"); //用文件路径设置铃声
		notification.defaults |= Notification.DEFAULT_SOUND; //使用默认铃声，会覆盖自定义的铃声设置
		notification.flags |= Notification.FLAG_INSISTENT; //铃声会一直重复播放，直到Notification被用户处理或关闭
		
//		设置Notification对象的震动
		long[] vibrate = {0,100,200,300}; //第1个值表示延迟毫秒数，第2个值表示震动毫秒数，第3个值表示延迟毫秒数……
		notification.vibrate = vibrate; //设置震动
		notification.defaults |= Notification.DEFAULT_VIBRATE; //使用默认震动，会覆盖自定义的震动设置
		
//		设置Notification对象的LED（不是所有设备都可以使用彩色LED）
		notification.ledARGB = 0xff00ff00; //设置LED的颜色，ARGB格式
		notification.ledOnMS = 300; //设置LED点亮的时间，单位为毫秒
		notification.ledOffMS = 1000; //设置LED熄灭的时间，单位为毫秒
		notification.flags |= Notification.FLAG_SHOW_LIGHTS; //设置Notification对象的Flag，允许LED。
		notification.defaults |= Notification.DEFAULT_LIGHTS; //使用默认LED设置，会覆盖自定义的LED设置
		
//		3 创建PendingIntent对象，并设置通知信息。
		PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, Activity.class), PendingIntent.FLAG_UPDATE_CURRENT);
		notification.setLatestEventInfo(this, "通知标题", "通知内容", pendingIntent); //该方法内部创建了默认的RemoteViews对象
		
//		4 触发提醒。
//		提醒触发时，若当前已存在一个相同Tag和ID的Notification提醒，则系统会用这个更新原来的。
		notificationManager.notify("NotificationTag", 0, notification);
		
//		5 关闭提醒
		notificationManager.cancel("NotificationTag", 0); //传入Tag和ID
		notificationManager.cancelAll(); //关闭所有提醒
		
		
//		创建自定义外观的StatusBarNotification
//		1 创建Layout文件。
//		从Android 2.3开始，系统定义了默认的NotificationStyle。为了自定义外观的StatusBarNotification的字体能够和通知栏的背景色区分开，TextView最好使用style="@style/NotificationTitle"。
		
//		2 创建RemoteViews对象。传入程序的包名、Layout的ID做参数。
		RemoteViews remoteViews = new RemoteViews(this.getPackageName(), android.R.layout.select_dialog_item);
		
//		3 将RemoteViews对象关联到Notification对象。
		notification.contentView = remoteViews;
		
//		4 创建PendingIntent对象。
		PendingIntent pendingIntent1 = PendingIntent.getActivity(this, 0, new Intent(this, Activity.class), PendingIntent.FLAG_UPDATE_CURRENT);
		
//		5 将PendingIntent对象关联到Notification对象。
		notification.contentIntent = pendingIntent1;
		
//		6 触发提醒。
//		提醒触发时，若当前已存在一个相同Tag和ID的Notification提醒，则系统会用这个更新原来的。
		notificationManager.notify("NotificationTag", 0, notification);
		
//		5 关闭提醒
		notificationManager.cancel("NotificationTag", 0); //传入Tag和ID
		notificationManager.cancelAll(); //关闭所有提醒
		
	}
	
	
}
